/*
 * Population.java
 *
 * Created on January 10, 2008, 2:06 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package engine;

import java.util.ArrayList;
/**
 * Populacja
 * @author Bejo
 */
public class Population implements PopInterface{
        
    private ArrayList<Specimen> specimenList = new ArrayList<Specimen>();
    
    /** Konstruktor tworzy zadana liczbe osobnikow
     * @param populationSize liczba osobników
     */
    public Population(int populationSize) {
        if (populationSize > 0)
            for (int i = 0; i < populationSize; i++)
                specimenList.add(new Specimen());
    }

    /** Krzyzuje dwoch osobnikow (argumenty) i umieszcza ich w swojej populacji
     * @param parent1 osobnik A
     * @param parent2 osobnik B
     */
    public void crossOver(Specimen parent1, Specimen parent2) {
        Specimen child1 = parent1.clone();
        Specimen child2 = parent2.clone();
        for(byte i = 0; i<Enviroment.genesNum; i++)
            if(Enviroment.random.nextBoolean()) {
                child1.setGene(i, parent2.getGene(i));
                child2.setGene(i, parent1.getGene(i));
            }
        child1.refreshAdaptationRatio();    //obliczamy wartosc funkcji celu dla nowych osobnikow
        child2.refreshAdaptationRatio();
        specimenList.add(child1);
        specimenList.add(child2);
    }
    
    /** Dodanie do populacji klonu osobnika-agrumentu
     * @param newOne nowy osobnik
     */
    public void addSpecimen(Specimen newOne) {
        specimenList.add(newOne.clone());
    }
    
    /** Zwraca n-tego osobnika
     * @param n numer osobnika
     * @return osobnik
     */
    public Specimen getSpecimen(int n) {
        return specimenList.get(n);
    }
    
    /** Zwraca aktualna liczbe osobnikow w populacji
     * @return liczba
     */
    public int count() {
        return specimenList.size();
    }

    /** Sortuje osobników w populacji */
    public void sort() {
        java.util.Collections.sort(specimenList);
    }
    
    /** Kasuje cala populacje */
    public void clear() {
        specimenList.clear();
    }
}